\section{Principe de fonctionnement}

	\begin{figure}[H]
		\includegraphics[scale=0.5]{img/seq1.png}	
		\caption{Exemple d'exécution d'un programme}
	\end{figure}
	
	La figure ci-dessus présente le déroulement de l'exécution d'un programme possédant un thread \textit{foo} et la fonction principale \verb?main()? qui doit \^etre gérée de manière identique. Sur cette figure il faut noter que l'entité ordonnanceur ne correspond pas à un thread mais à une portion de code de la bibliothèque qui est appelée.\\
	
	Les fonctions de notre bibliothèque utilisent des appels à des fonctions de la bibliothèque \textit{ucontext} (\verb?makecontext()?, \verb?swapcontext()?, \verb?getcontext()?) pour manipuler le contexte utilisateur.\\
	
	Lors de l'appel de \verb?thread_create()? fait appel aux fonctions système \verb?getcontext()?  et \verb?makecontext()? qui respectivement récupère le contexte courant et crée le contexte associé au thread.\\
	

	Chaque thread est placé dans une liste accessible à l'ordonnanceur : la \textbf{runQueue}.  L'ordonnanceur possède aussi un accès vers le contexte principal (celui du "thread" correspondant main) et à une autre liste qui correspond aux threads terminés : \textbf{endQueue}.\\
	
	Ainsi à chaque changement de contexte, l'ordonnanceur élit un thread dans la runQueue, place celui qui était en exécution dans la runQueue et échange le contexte courant avec celui du thread choisi.\\
	
	Lorsqu'un thread appelle \verb?thread_exit()? il est alors supprimé de la runQueue et est placé dans la endQueue.\\
	
	Si le thread n'est pas attendu par un autre (en utilisant \verb?thread_join()?), il peut alors \^etre supprimé définitivement de la mémoire, sinon on attends que les threads ayant besoin de ce dernier terminent leur exécution avant de le supprimer.
	
%	Dans cet exemple, la fonction main crée un thread \textit{foo}. Cette création va créer un contexte pour le thread \textit{foo}. Après la création du thread, un appel à thread\_yield() est effectué. Cet appel invoque l'ordonnanceur qui élit le thread à exécuter (ici \textbf{foo}). Un changement de contexte est effectué et lance ainsi l'exécution du thread \textit{foo}. Les changements de contextes se déroulent tout au long de l'exécution gr\^ace à \textit{thread\_yield()}. La valeur de retour du thread est sauvegarder lors de l'appel à \textit{thread\_exit()} qui appelle \textit{thread\_yield()} pour continuer l'exécution.\\

	
